#ifndef _THREAD_POOL_H_
#define _THREAD_POOL_H_

#include <stdbool.h>

#define MAX_WAITING_TASKS	1000	//最大的等待任务数量

// 作为 参数
struct task_arg
{
    int * flag; // 只使用flag 作为
};

/*		以下内容不需要修改 		*/
struct task					//任务链表结构体
{
	void *(*task)(void *arg);	//任务做什么事情的函数指针
	void *arg;					//传入函数的参数

	struct task *next;			//链表的位置结构体指针
};

typedef struct thread_pool
{
	pthread_mutex_t lock;		//用于线程池同步互斥的互斥锁
	pthread_cond_t  cond;		//用于让线程池里面的线程睡眠的条件变量
	struct task *task_list;		//线程池的执行任务链表

	pthread_t *tids;			//线程池里面线程的ID登记处

	unsigned int waiting_tasks;		//等待的任务数量，也就是上面任务链表的长度
	unsigned int active_threads;	//当前已经创建的线程数
	unsigned int max_active_threads;// 允许的最大线程线

	bool shutdown;				//线程池的开关
}thread_pool;

//初始化线程池
thread_pool *init_pool(unsigned int max_active_threads,
                       unsigned int threads_number);

// 设置最大工作线程数
int set_max_active_threads(thread_pool* pool, 
                           unsigned int now_max_active_threads);

// 往线程池里面添加任务节点
bool add_task(thread_pool *pool,
         void *(*task)(void *arg),
         void *arg);

//添加工作线程
int add_thread(thread_pool *pool,
           unsigned int additional_threads_number);	

//移除工作线程
int remove_thread(thread_pool *pool,
              unsigned int removing_threads_number);

//销毁线程池
bool destroy_pool(thread_pool **p);

//线程池里面线程的执行函数
void *routine(void *arg);

#endif
